024. Swap Nodes in Pairs[E]

题目

Given a linked list, swap every two adjacent nodes and return its head.

For example,
Given 1->2->3->4, you should return the list as 2->1->4->3.

Your algorithm should use only constant space. You may not modify the values in the list, only nodes itself can be changed.

思路

这个题目的意思是每2个元素要交换一下,我们已经做了很多有关链表的问题,知道凡是涉及链表的操作,比较麻烦的地方都在与链表的操作都必须涉及到它的父亲。

这题也不例外,需要考虑很多问题:

  1. 如果链表头要交换怎么办
  2. 如何方便的交换两个节点
  3. 如果长度不为偶数怎么办

问题1我们已经说过很多遍了,直接用一个新节点去解决这个问题。

  1. ListNode newhead = new ListNode(0);

问题2,这里得知道,如果涉及到链表交换操作,那么它至少涉及3个节点:当前节点,当前节点的父亲,当前节点的孩子这里由于我们循环是从前往后走的,所以我们这里使用:当前节点,当前节点的孩子,当前节点的孙子,可能更方便。

  1. ListNode first = current.next;
  2. ListNode second = current.next.next;

交换操作就很简单了

  1. first.next = second.next;
  2. current.next = second;
  3. current.next.next = first;
  4. current = current.next.next;

问题3,我们得需要加入判断,当前节点的孩子和孙子都要有才能继续

  1. while (current.next != null && current.next.next != null)

所以这样一分析,代码就很容易写出来了

代码

  1. public class Solution {
  2. public ListNode swapPairs(ListNode head) {
  3. if(head == null)
  4. return null;
  5. ListNode newhead = new ListNode(0);
  6. newhead.next = head;
  7. ListNode current = newhead;
  8. while (current.next != null && current.next.next != null) {
  9. ListNode first = current.next;
  10. ListNode second = current.next.next;
  11. first.next = second.next;
  12. current.next = second;
  13. current.next.next = first;
  14. current = current.next.next;
  15. }
  16. return newhead.next;
  17. }
  18. }